package dao

import (
	"errors"
	"fmt"
	"github.com/google/uuid"
	"log"
	"math/rand"
	"regexp"
	"strconv"
	"strings"
	"time"
	"user_srv/basic/config"
	__ "user_srv/basic/userproto"
	"user_srv/handler/models"
	"user_srv/untils"
)

// 注册用户
func RegisterUser(in *__.RegisterUserReq) (*models.User, error) {
	// 1. 参数验证
	if err := validateRegisterRequest(in); err != nil {
		log.Printf("用户注册参数验证失败: %v", err)
		return nil, fmt.Errorf("参数验证失败: %w", err)
	}

	// 2. 检查手机号是否已存在
	if err := validateMobileUnique(in.Mobile); err != nil {
		log.Printf("手机号验证失败: %v", err)
		return nil, fmt.Errorf("手机号验证失败: %w", err)
	}

	// 3. 创建用户
	user := &models.User{
		Mobile:   in.Mobile,
		Password: untils.DoubleMD5(in.Password),
	}

	// 4. 保存到数据库
	if err := user.Create(); err != nil {
		log.Printf("用户注册失败: %v", err)
		return nil, fmt.Errorf("注册失败: %w", err)
	}

	log.Printf("用户注册成功，手机号: %s", in.Mobile)
	return user, nil
}

// 发送短信
func SendSms(in *__.SendSmsReq) error {
	//判断手机号
	if !untils.IsValidMobile(in.Mobile) {
		return errors.New("手机号格式错误")
	}
	count := config.Rdb.Get(config.Ctx, "SendSmsErr"+in.Mobile).Val()
	if count == "3" {
		return errors.New("发送失败，请1分钟后再试")
	}
	sendSms := untils.HuYiWuXian{}

	code := rand.Intn(9000) + 1000
	_, err := sendSms.Send(in.Mobile, strconv.Itoa(code))

	if err != nil {
		return err
	}

	config.Rdb.Set(config.Ctx, "SendSmsCode"+in.Mobile, code, time.Minute*1)
	config.Rdb.Incr(config.Ctx, "SendSmsErr"+in.Mobile)
	config.Rdb.Expire(config.Ctx, "SendSmsErr"+in.Mobile, time.Minute*1)
	return nil
}

// 登录用户
func LoginUser(in *__.LoginUserReq) (*models.User, error) {
	code := config.Rdb.Get(config.Ctx, "SendSmsCode"+in.Mobile).Val()

	user := models.User{
		Mobile:   in.Mobile,
		Password: untils.DoubleMD5(in.Password),
	}
	if in.Mobile == "" || in.Password == "" {
		return nil, errors.New("手机号不能为空or密码不能为空")
	}

	err := user.GetUserByMobile()
	if err != nil {
		return nil, errors.New("用户不存在")
	}

	if untils.DoubleMD5(in.Password) != user.Password {
		return nil, errors.New("密码错误")
	}
	if code != in.Sms {
		return nil, errors.New("验证码错误")
	}

	return &user, nil
}

// 创建用户钱包
func UserWallet(in *__.UserWalletReq) (*models.UserWallet, error) {

	user := models.UserWallet{
		UserId:                   int32(in.UserId),
		UserAvailableBalance:     in.UserAvailableBalance,
		UserFrozenBalance:        in.UserFrozenBalance,
		UserInvoiceableAmount:    in.UserInvoiceableAmount,
		UninvoicedAmountForTrips: in.UninvoicedAmountForTrips,
	}
	var users models.User
	users.Id = uint64(in.UserId)
	err := users.GetUserById()
	if err != nil {
		return nil, errors.New("用户不存在")
	}
	if user.Id != 0 {
		return nil, errors.New("用户不存在")
	}
	if err = user.Create(); err != nil {
		return nil, errors.New("创建用户钱包失败" + err.Error())
	}
	return &user, nil
}

// 创建个人用户信息
func IndividualUser(in *__.IndividualUserReq) (*models.Userindel, error) {
	// 创建用户模型
	user := models.Userindel{
		Name:                in.Name,
		Mobile:              in.Mobile,
		EnterpriseUser:      in.EnterpriseUser,
		MemberLevel:         in.MemberLevel,
		UserPrice:           float64(in.UserPrice),
		RegistrationChannel: in.RegistrationChannel,
	}
	err := user.GetUserMobile()
	if err != nil {
		return nil, errors.New("手机号已存在")
	}
	if user.Id != 0 {
		return nil, errors.New("用户已存在")
	}
	// 保存到数据库
	err = user.CreateUser()
	if err != nil {
		return nil, errors.New("创建用户失败: " + err.Error())
	}

	return &user, nil
}

// 保存用户消费信息
func UserConsumptionInformation(in *__.UserConsumptionInformationReq) (*models.UserConsumptionInformation, error) {
	users := models.UserConsumptionInformation{
		UserId:                    in.UserId,
		PayNo:                     in.PayNo,
		Event:                     in.Event,
		PriceTime:                 time.Time{},
		OrderNo:                   uuid.NewString(),
		GiftAmount:                in.GiftAmount,
		RechargeAmountPrincipal:   in.RechargeAmountPrincipal,
		TotalRechargeAmount:       in.TotalRechargeAmount,
		RefundAmount:              in.RefundAmount,
		TotalOrderPrice:           float64(in.TotalOrderPrice),
		MonthlyOrderPaymentAmount: in.MonthlyOrderPaymentAmount,
	}
	var user models.User
	user.Id = uint64(in.UserId)
	err := user.GetUserById()
	if err != nil {
		return nil, errors.New("用户不存在")
	}
	if user.Id == 0 {
		return nil, errors.New("用户不存在")
	}

	err = user.Create()
	if err != nil {
		return nil, errors.New("消费记录保存失败: " + err.Error())
	}
	return &users, nil
}

// 保存用户发票信息
func UserInvoice(in *__.UserInvoiceReq) (*models.Invoice, error) {
	Invoice := models.Invoice{
		Name:                    in.Name,
		Mobile:                  in.Mobile,
		Address:                 in.Address,
		BankOfDeposit:           in.BankOfDeposit,
		BankAccount:             in.BankAccount,
		TaxIdentificationNumber: in.TaxIdentificationNumber,
	}
	var user models.User
	user.Mobile = in.Mobile
	err := user.GetUserByMobile()
	if err != nil {
		return nil, errors.New("电话号不存在，无法创建发票")
	}

	err = Invoice.Create()
	if err != nil {
		return nil, errors.New("创建发票失败" + err.Error())
	}
	return &Invoice, nil
}

// 发票详情
func UserInvoiceDetail(in *__.UserInvoiceDetailReq) (*models.Invoice, error) {
	var invoice models.Invoice
	invoice.Id = uint64(in.Id)
	err := invoice.GetInvoiceById()
	if err != nil {
		return nil, errors.New("发票不存在")
	}
	return &invoice, nil
}

// 用户详情
func UserindelDetail(in *__.UserindelDetailReq) (*models.Userindel, error) {
	var user models.Userindel
	user.Id = uint64(in.Id)
	err := user.GetUserById()
	if err != nil {
		return nil, errors.New("用户不存在")
	}
	return &user, nil
}

// 用户消费信息详情
func UserConsumptionInformationDetail(in *__.UserConsumptionInformationDetailReq) (*models.UserConsumptionInformation, error) {
	var user models.UserConsumptionInformation
	user.UserId = in.UserId
	err := user.GetUserConsumptionInformationById()
	if err != nil {
		return nil, errors.New("用户不存在")
	}
	return &user, nil
}

// 实名认证
func RealName(in *__.RealNameReq) (*models.User, error) {
	// 1. 验证参数格式
	if !untils.IsValidIdCard(in.GetIdCard()) {
		return nil, errors.New("身份证号格式错误")
	}

	// 2. 查找用户信息
	var user models.User
	user.Id = uint64(in.GetUserId())
	err := user.GetUserById()
	if err != nil {
		return nil, errors.New("用户信息查找失败")
	}

	// 3. 检查是否已实名认证
	if user.IdCard != "" {
		return nil, errors.New("该账号已经实名")
	}

	// 4. 调用腾讯云API进行实名认证
	// 注意：这里保持了对腾讯云封装的调用

	// 5. 更新用户实名认证信息
	user.IdCard = desensitizeIdCard(in.GetIdCard()) // 保存脱敏后的身份证号
	user.CType = 1                                  // 设置为已实名用户类型（根据User结构体定义：1：已实名，2：未实名）

	// 6. 保存更新到数据库
	if !user.Update() {
		// 为了调试，添加更详细的错误检查
		// 直接尝试更新并获取具体错误
		if err = config.DB.Model(&models.User{}).Where("id = ?", user.Id).Updates(map[string]interface{}{
			"nick_name": user.NickName,
			"id_card":   user.IdCard,
			"c_type":    user.CType,
		}).Error; err != nil {
			return nil, fmt.Errorf("用户实名认证信息更新失败: %v", err)
		}
		return nil, errors.New("用户实名认证信息更新失败")
	}

	return &user, nil
}

// 身份证号脱敏显示
func desensitizeIdCard(idCard string) string {
	length := len(idCard)
	if length <= 0 {
		return ""
	}
	//保留前三位和后四位
	keepPrefix := 3 //前三位地区码
	keepSuffix := 4 //后四位
	return idCard[:keepPrefix] + strings.Repeat("*", length-keepPrefix-keepSuffix) + idCard[length-keepSuffix:]
}

// 列表终端
func ListTerminal(in *__.ListTerminalReq) (*models.UserFeedback, error) {
	terminal := models.UserFeedback{
		Terminal: in.Terminal,
	}
	err := terminal.GetTerminal()
	if err != nil {
		return nil, errors.New("终端不存在")
	}
	return &terminal, err
}

// 列表手机号
func ListMobile(in *__.ListMobileReq) (*models.UserFeedback, error) {
	mobile := models.UserFeedback{
		Mobile: in.Mobile,
	}
	err := mobile.GetMobile()
	if err != nil {
		return nil, errors.New("手机号不存在")
	}
	return &mobile, err
}

// 列表手机号状态
func ListPhoneStatus(in *__.ListPhoneStatusReq) (*models.UserFeedback, error) {
	status := models.UserFeedback{
		PhoneStatus: int32(in.PhoneStatus),
	}

	err := status.GetMobile()
	if err != nil {
		return nil, errors.New("手机号状态不存在")
	}
	return &status, nil
}

// 发票号码列表
func ListTaxIdentificationNumber(in *__.ListTaxIdentificationNumberReq) (*models.Invoice, error) {
	list := models.Invoice{
		TaxIdentificationNumber: in.TaxIdentificationNumber,
	}
	err := list.GetInvoiceById()
	if err != nil {
		return nil, errors.New("查询发票号码失败" + err.Error())
	}
	return &list, nil
}

// 完善用户信息
func UpdateUser(in *__.UpdateUserReq) (*models.User, error) {
	user := models.User{
		Id:                      uint64(in.UserId),
		NickName:                in.NickName,
		RealName:                in.RealName,
		Sex:                     in.Sex,
		Address:                 in.Address,
		UserRegisterTime:        time.Now(),
		UserLoginTime:           time.Now(),
		LastLoginMethod:         in.LastLoginMethod,
		LastLoginTimeOnScreen:   time.Now(),
		LastLoginMethodOnScreen: in.LastLoginMethodOnScreen,
		LastOrderTime:           time.Now(),
		CType:                   in.CType,
		UserRole:                uint8(in.UserRole),
	}
	err := user.GetUserById()
	if err != nil {
		return nil, errors.New("用户不存在")
	}
	//if user.RealName == "" {
	//	return nil, errors.New("请先实名认证")
	//}

	if !user.Update() {
		return nil, errors.New("用户信息更新失败")
	}
	return &user, nil
}

// validateRegisterRequest 验证注册请求参数
func validateRegisterRequest(in *__.RegisterUserReq) error {
	if in == nil {
		return errors.New("请求参数不能为空")
	}

	// 验证手机号
	if strings.TrimSpace(in.Mobile) == "" {
		return errors.New("手机号不能为空")
	}

	if !untils.IsValidMobile(in.Mobile) {
		return errors.New("手机号格式不正确")
	}

	// 验证密码
	if strings.TrimSpace(in.Password) == "" {
		return errors.New("密码不能为空")
	}

	if len(in.Password) < 6 {
		return errors.New("密码长度不能少于6位")
	}

	if len(in.Password) > 20 {
		return errors.New("密码长度不能超过20位")
	}

	return nil
}

// validateMobileUnique 验证手机号唯一性
func validateMobileUnique(mobile string) error {
	var user models.User
	user.Mobile = mobile
	err := user.GetUserByMobile()
	if err == nil {
		return errors.New("手机号已存在")
	}
	return nil
}

// validateLoginRequest 验证登录请求参数
func validateLoginRequest(in *__.LoginUserReq) error {
	if in == nil {
		return errors.New("请求参数不能为空")
	}

	// 验证手机号
	if strings.TrimSpace(in.Mobile) == "" {
		return errors.New("手机号不能为空")
	}

	if !untils.IsValidMobile(in.Mobile) {
		return errors.New("手机号格式不正确")
	}

	// 验证密码
	if strings.TrimSpace(in.Password) == "" {
		return errors.New("密码不能为空")
	}

	// 验证短信验证码
	if strings.TrimSpace(in.Sms) == "" {
		return errors.New("短信验证码不能为空")
	}

	return nil
}

// validateSmsCode 验证短信验证码
func validateSmsCode(mobile, smsCode string) error {
	// 从Redis获取验证码
	storedCode := config.Rdb.Get(config.Ctx, "SendSmsCode"+mobile).Val()
	if storedCode == "" {
		return errors.New("验证码已过期或不存在")
	}

	if storedCode != smsCode {
		return errors.New("验证码错误")
	}

	return nil
}

//// validateWalletRequest 验证钱包创建请求
//func validateWalletRequest(in *__.UserWalletReq) error {
//	if in == nil {
//		return errors.New("请求参数不能为空")
//	}
//
//	if in.UserId <= 0 {
//		return errors.New("用户ID必须大于0")
//	}
//
//	// 验证余额不能为负数
//	if in.UserAvailableBalance < 0 {
//		return errors.New("可用余额不能为负数")
//	}
//
//	if in.UserFrozenBalance < 0 {
//		return errors.New("冻结余额不能为负数")
//	}
//
//	if in.UserInvoiceableAmount < 0 {
//		return errors.New("可开票金额不能为负数")
//	}
//
//	if in.UninvoicedAmountForTrips < 0 {
//		return errors.New("未开票金额不能为负数")
//	}
//
//	return nil
//}

// validateIndividualUserRequest 验证个人用户信息请求
func validateIndividualUserRequest(in *__.IndividualUserReq) error {
	if in == nil {
		return errors.New("请求参数不能为空")
	}

	// 验证必填字段
	if strings.TrimSpace(in.Name) == "" {
		return errors.New("姓名不能为空")
	}

	if strings.TrimSpace(in.Mobile) == "" {
		return errors.New("手机号不能为空")
	}

	if !untils.IsValidMobile(in.Mobile) {
		return errors.New("手机号格式不正确")
	}

	if strings.TrimSpace(in.RegistrationChannel) == "" {
		return errors.New("注册渠道不能为空")
	}

	// 验证金额
	if in.UserPrice < 0 {
		return errors.New("用户价格不能为负数")
	}

	return nil
}

// validateInvoiceRequest 验证发票信息请求
func validateInvoiceRequest(in *__.UserInvoiceReq) error {
	if in == nil {
		return errors.New("请求参数不能为空")
	}

	// 验证必填字段
	if strings.TrimSpace(in.Name) == "" {
		return errors.New("姓名不能为空")
	}

	if strings.TrimSpace(in.Mobile) == "" {
		return errors.New("手机号不能为空")
	}

	if !untils.IsValidMobile(in.Mobile) {
		return errors.New("手机号格式不正确")
	}

	if strings.TrimSpace(in.Address) == "" {
		return errors.New("地址不能为空")
	}

	if strings.TrimSpace(in.TaxIdentificationNumber) == "" {
		return errors.New("税号不能为空")
	}

	// 验证税号格式（18位数字或字母数字组合）
	if !isValidTaxNumber(in.TaxIdentificationNumber) {
		return errors.New("税号格式不正确")
	}

	return nil
}

// validateRealNameRequest 验证实名认证请求
func validateRealNameRequest(in *__.RealNameReq) error {
	if in == nil {
		return errors.New("请求参数不能为空")
	}

	if in.UserId <= 0 {
		return errors.New("用户ID必须大于0")
	}

	if strings.TrimSpace(in.IdCard) == "" {
		return errors.New("身份证号不能为空")
	}

	if !untils.IsValidIdCard(in.IdCard) {
		return errors.New("身份证号格式不正确")
	}

	return nil
}

// isValidTaxNumber 验证税号格式
func isValidTaxNumber(taxNumber string) bool {
	// 税号通常是15-20位的数字或字母数字组合
	matched, _ := regexp.MatchString(`^[A-Za-z0-9]{15,20}$`, taxNumber)
	return matched
}
